/* 
 * File:   logger.cpp
 * Author: Bram
 * 
 * Created on January 9, 2013, 1:20 PM
 */


#include "logger.h"


const enum logger::logLevels DEFAULT_LOG_LEVEL = logger::LEVEL_1;


logger::logger()
{
   initVars();
   init();
} 

logger::logger(const string& fileName)
{
    initVars();
    init(fileName);
}

logger::logger(const string& fileName,enum logLevels levelIn)
{
    initVars();
    logLevel = levelIn;
    init(fileName);
}

logger::~logger()
{
   if ( logLevel<QUIET_MODE )
   {
      clear(ios::goodbit);
      *this << endl;
      printHeader(1);    // add ending time to log file
   }
   close();
}

void logger::init(const string& fileName)
{
   if ( (fileName.c_str())[0] )
      openLog(fileName,LOG_WRITE);
   else
      openLog("syslog.log",LOG_WRITE);
}

void logger::init(const string& fileName, int mode)
{
   if ( (fileName.c_str())[0] )
      openLog(fileName,mode);
   else
      openLog("syslog.log", mode);
}

void logger::init()
{
   openLog("syslog.log",LOG_WRITE);
}

void logger::openLog(const string& fileName, int mode)
{
   if (logLevel < QUIET_MODE)
   {
       if(LOG_WRITE == mode){
           open(fileName.c_str(),ios::out);
       } else {
           open(fileName.c_str(),ios::app);
       }
      
      
      // fail() returns a null zero when operation fails   
      // rc = (*this).fail();
    
      if ( fail() == 0 )
      {
         logName = fileName;
         printHeader(0);         // insert start time into top of log file
      }
      else
      {
         cout << "ERROR: Log file " << fileName.c_str() 
              << " could not be opened for write access." << endl;
         logLevel = QUIET_MODE;
      }
   }
   else
   {
      cout << "Logging disabled (QUIET_MODE set)" << endl;
   }
}

void logger::initVars()
{
   time(&startTime);
   logLevel = DEFAULT_LOG_LEVEL;
}

void logger::printHeader(int theEnd)
{
   if ( logLevel < QUIET_MODE )
   {
      clear(ios::goodbit);

      // setup time
      time_t sttime;
      //time(sttime);
	  
      // convert to gm time
      struct tm * tim;
        //struct tm  timeinfo;
        time ( &sttime );
        tim = localtime ( &sttime );
	//gmtime(&timeinfo,&sttime);
	//tim = &timeinfo;
	  

      // set data items
      int sec  = tim->tm_sec;           // second (0-61, allows for leap seconds)
      int min  = tim->tm_min;           // minute (0-59)
      int hour = tim->tm_hour;          // hour (0-23)

      int mon  = tim->tm_mon + 1;       // month (0-11)
      int mday = tim->tm_mday;          // day of the month (1-31)
      int year = tim->tm_year % 100;    // years since 1900

      char cur_time[9];
      char cur_date[9];

      sprintf(cur_time,"%02d:%02d:%02d",hour,min,sec);
      sprintf(cur_date,"%02d/%02d/%02d",mon,mday,year);

      //char line_1[61];
      //sprintf(line_1,"A yuChen Technology Development Work Log File");

      char line_2[61];
      sprintf(line_2,"DATE: %s - %s%30s",cur_date,cur_time,logName.c_str());

      //*this << line_1 << endl;
      *this << line_2 << endl << endl;

      if (theEnd) *this << getExecTime() << endl;
   }
        
} 

void logger::getExecTime(int* min, int* sec)
{
   time_t endTime;
   time(&endTime);
   *min = (int)((endTime - startTime)/60);
   *sec = (int)((endTime - startTime)%60);
} 

char* logger::getExecTime()
{
    int min = 0;
    int sec = 0;
    getExecTime(&min, &sec);
    static char execTime[128];
    sprintf(execTime, "Execution time: %d minutes %d seconds", min, sec);
    return execTime;
}



//tijdelijk om ff meuk naar het clipboard te ramme in windows
void logger::winClipboardTEMP(const string& strToCopyToClipboard)
{
    #if defined _OS_WIN
        char msgLength[MSG_HEADER_LEN+1];
        sprintf(msgLength,"%6d",strToCopyToClipboard.size());
        string sendMsg = string(msgLength);
        sendMsg += strToCopyToClipboard;
        
        HGLOBAL hText;
	char *pText;
	hText = GlobalAlloc(GMEM_DDESHARE|GMEM_MOVEABLE, sendMsg.size()+1);
	pText = (char*)GlobalLock(hText);
	strcpy(pText, sendMsg.c_str());
	GlobalUnlock(hText);
	OpenClipboard(NULL);
	EmptyClipboard();
	SetClipboardData(CF_TEXT, hText);
	CloseClipboard();
    #endif
}